/**
 * 工厂方法  定义一个创建产品对象的工厂接口，    将实际创建工作推迟到  子类当中
 * 此模式的核心精神是封装类中不变的部分，    提取其中个性化善变的部分为独立类，  解决“单个对象”的需求变化  
 * 他的核心结构有四个角色，分别是抽象工厂；具体工厂；抽象产品；具体产品 [1] 
 */
// 安全模式是指 屏蔽对类的错误使用而导致的错误  
/*use strict*/ 
let Demo = function(){
  if(!(this instanceof Demo)){   // 安全模式  防止在实例化类的时候没有写new
    return new Demo()
  }
}

Demo.prototype.show = function (){
  console.log('demo')
}

let d= new Demo()

// d.show()


//添加广告需求
 let Factory = function (type,content){
    if(this instanceof Factory){   // 安全模式  防止在实例化类的时候没有写new
      // console.log(this)  // 指向Factory类
      let s = new this[type](content)
      return s
    }else{
      return new Factory(type,content)
    }
 }

 Factory.prototype = {
   php:function(content){
    (function(content){
      var div = document.createElement('div')
      div.innerHTML = content
      div.style.border = '1px solid blue'
      document.getElementById('container').appendChild(div)
    })(content)
   },
   javascript:function(content){
      this.content = content;
      (function(content){
        var div = document.createElement('div')
        div.innerHTML = content
        div.style.border = '1px solid red'
        document.getElementById('container').appendChild(div)
      })(content)
   },
   ts:function(content){
    this.content = content;
    (function(content){
      var div = document.createElement('div')
      div.innerHTML = content
      div.style.border = '1px solid green'
      document.getElementById('container').appendChild(div)
    })(content)
 },
 }

 var data = [
   {type: 'javascript', content:'javascript 最牛逼'},
   {type:'php', content:'php是世界上最好的语言'},
   {type:'ts', content:'我想学习ts'},
 ]
//  let t = Factory('Java','Java还行')
for(var i=0 ; i<data.length; i++){
  Factory(data[i].type, data[i].content)
}
// let js=new Factory('Js','JavaScript还行')
// Factory('Java','Java还行')


//  let aaa =() => {   //this 还是会从紧邻上下文中获取，而不是那个新创建的对象。
//    console.log('555')
//  }
// console.log(new aaa())  //aaa is not a constructor